package com.designpatterns.proxypattern.cglibproxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 *
 */
public class CGLIBInterceptor implements MethodInterceptor {
    /**
     * 被代理对象（真实对象）
     */
    private Object target;

    /**
     * 代理方法的逻辑
     *
     * @param o           代理对象
     * @param method      方法
     * @param objects     方法参数
     * @param methodProxy 方法代理
     * @return 代理结果返回
     * @throws Throwable 异常
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("加入代理逻辑");
        System.out.println("调用真实对象之前的逻辑");
        Object obj = methodProxy.invokeSuper(o, objects);
        System.out.println("调用真实对象之后的逻辑");
        return obj;
    }

    /**
     * 建立被代理对象和代理对象间的代理关系,返回CGLIB代理对象
     *
     * @param target 被代理对象（真实对象）
     * @return 代理对象
     */
    @SuppressWarnings("unchecked")
    public <T> T getProxy(T target) {
        this.target = target;
        return (T) Enhancer.create(this.target.getClass(), this);
    }
}
